package com.weeho.dongyong.utils;

import java.util.Date;
import java.util.Random;

public class RandomUtil {

    /**
     * 生成验证马
     *
     * @return
     */
    public static String getNextCheckCode() {
        return getRamdomIntString(6);
    }

    /**
     * 生成盐
     *
     * @return
     */
    public static String getNextSalt() {

        return getRamdomIntString(6);
    }

    public static String getRamdomIntString(int length) {
        // 创建一个随机数生成器类。
        Random random = new Random();
        // randomCode用于保存随机产生的验证码，以便用户登录后进行验证。   
        StringBuffer randomCode = new StringBuffer();
        // 设置默认生成6个验证码

        // 设置备选验证码:包括"a-z"和数字"0-9"   
        String base = "0123456789";

        int size = base.length();

        // 随机产生4位数字的验证码。   
        for (int i = 0; i < length; i++) {
            // 得到随机产生的验证码数字。   
            int start = random.nextInt(size);
            String strRand = base.substring(start, start + 1);
            // 将产生的四个随机数组合在一起。   
            randomCode.append(strRand);
        }
        return randomCode.toString();
    }

    /**
     * 生成城市id
     *
     * @param parentId
     * @return
     */
    public static String getNextCityId(String parentId) {
        // 创建一个随机数生成器类。
        Random random = new Random();
        // randomCode用于保存随机产生的验证码，以便用户登录后进行验证。   
        StringBuffer randomCode = new StringBuffer();
        // 设置默认生成4个验证码
        int length = 4;
        // 设置备选验证码:包括"a-z"和数字"0-9"   
        String base = "abcdefghigklmnopqrstuvwxyz0123456789";

        int size = base.length();

        // 随机产生4位数字的验证码。   
        for (int i = 0; i < length; i++) {
            // 得到随机产生的验证码数字。   
            int start = random.nextInt(size);
            String strRand = base.substring(start, start + 1);
            // 将产生的四个随机数组合在一起。   
            randomCode.append(strRand);
        }
        if ("0".equals(parentId)) {
            return randomCode.toString();
        }
        return parentId + randomCode.toString();
    }

    /**
     * 这是典型的随机洗牌算法。
     * 流程是从备选数组中选择一个放入目标数组中，将选取的数组从备选数组移除（放至最后，并缩小选择区域）
     * 算法时间复杂度O(n)
     *
     * @return 随机8为不重复数组
     */
    public static String generateNumber() {
        String no = "";
        //初始化备选数组
        int[] defaultNums = new int[10];
        for (int i = 0; i < defaultNums.length; i++) {
            defaultNums[i] = i;
        }

        Random random = new Random();
        int[] nums = new int[LENGTH];
        //默认数组中可以选择的部分长度
        int canBeUsed = 10;
        //填充目标数组
        for (int i = 0; i < nums.length; i++) {
            //将随机选取的数字存入目标数组
            int index = random.nextInt(canBeUsed);
            nums[i] = defaultNums[index];
            //将已用过的数字扔到备选数组最后，并减小可选区域
            swap(index, canBeUsed - 1, defaultNums);
            canBeUsed--;
        }
        if (nums.length > 0) {
            for (int i = 0; i < nums.length; i++) {
                no += nums[i];
            }
        }

        return no;
    }

    private static final int LENGTH = 8;

    private static void swap(int i, int j, int[] nums) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public static String generateNumber2() {
        String no = "";
        int num[] = new int[LENGTH];
        int c = 0;
        for (int i = 0; i < LENGTH; i++) {
            num[i] = new Random().nextInt(10);
            c = num[i];
            for (int j = 0; j < i; j++) {
                if (num[j] == c) {
                    i--;
                    break;
                }
            }
        }
        if (num.length > 0) {
            for (int i = 0; i < num.length; i++) {
                no += num[i];
            }
        }
        return no;
    }

    public static String generateNumber2(int length) {
        String no = "";
        int num[] = new int[length];
        int c = 0;
        for (int i = 0; i < length; i++) {
            num[i] = new Random().nextInt(10);
            c = num[i];
            for (int j = 0; j < i; j++) {
                if (num[j] == c) {
                    i--;
                    break;
                }
            }
        }
        if (num.length > 0) {
            for (int i = 0; i < num.length; i++) {
                no += num[i];
            }
        }
        return no;
    }
    public static String getRandomByDigit(int n){
        int c = n/5;
        int nmod = n % 5;
        String s= "";
        for(int i=0;i<c;i++){
            s+=random5();
        }
        s+=random4(nmod);
        return s;
    }

    public static String random5(){
        int tmp = Math.abs(new Random().nextInt(100000-1));
        return String.valueOf(String.valueOf(tmp).length() == 5 ?tmp:tmp+10000);
    }

    public static String random4(int n){
        if(n <=0){
            return "";
        }
        int min = (int)Math.pow(10, n-1);
        int tmp = Math.abs(new Random().nextInt((int)Math.pow(10, n)));
        return String.valueOf(String.valueOf(tmp).length() == n ?tmp:tmp+min);
    }

    public static String getFlowNo() {
        // 订单位数总和不超过 28位,商户号13位
        String timeNum = String.valueOf(new Date().getTime());//获取当前时间的毫秒数
        int totalLength = 28;
        String storeNo = "XBXR";
        return storeNo+timeNum + getRandomByDigit(totalLength-timeNum.length()-storeNo.length());
    }

    public static String getPayFlowNo() {
        // 订单位数总和不超过 28位,商户号13位
        String timeNum = String.valueOf(new Date().getTime());//获取当前时间的毫秒数
        int totalLength = 28;
        String storeNo = "XBX";
        return storeNo+timeNum + getRandomByDigit(totalLength-timeNum.length()-storeNo.length());
    }

    public static String getNickName(){
        return "秀波_"+ getRandomByDigit(6);
    }
}
